package cn.walls1717.wallsmall.cart.interceptor;

import cn.hutool.core.util.StrUtil;
import cn.walls1717.wallsmall.cart.to.UserInfoTO;
import cn.walls1717.wallsmall.cart.util.UserHandler;
import cn.walls1717.wallsmall.common.pojo.vo.MemberRespVO;
import org.jetbrains.annotations.NotNull;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

import static cn.walls1717.wallsmall.common.constant.auth.AuthServerConstant.LOGIN_USER;
import static cn.walls1717.wallsmall.common.constant.cart.CartConstant.TEMP_USER_COOKIE_NAME;
import static cn.walls1717.wallsmall.common.constant.cart.CartConstant.TEMP_USER_COOKIE_TIMEOUT;

/**
 * 购物车拦截器
 *
 * @author walls1717
 * @since 2022/11/15 9:14
 **/
public class CartInterceptor implements HandlerInterceptor {

    /**
     * 业务代码执行之前，在ThreadLocal中存放用户信息。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, @NotNull HttpServletResponse response,
        @NotNull Object handler) {

        // 从session中取出用户信息
        MemberRespVO loginUser = (MemberRespVO)request.getSession().getAttribute(LOGIN_USER);
        UserInfoTO userInfoTO = new UserInfoTO();
        // 能从session中取出用户信息，说明已登录，设置已登录的用户id。
        if (loginUser != null) {
            userInfoTO.setUserId(Long.parseLong(loginUser.getId().toString()));
        }
        // 如果本身浏览器已经携带user-key，则取出名为user-key的cookie，user-key是临时用户信息。
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals(TEMP_USER_COOKIE_NAME)) {
                    userInfoTO.setUserKey(cookie.getValue());
                    // 设置临时用户标识
                    userInfoTO.setTempUser(true);
                }
            }
        }
        // 浏览器中没有携带user-key，那么设置一个随机的user-key。
        if (StrUtil.isEmpty(userInfoTO.getUserKey())) {
            userInfoTO.setUserKey(UUID.randomUUID().toString());
        }
        // 存放到ThreadLocal中
        UserHandler.set(userInfoTO);
        return true;
    }

    /**
     * 无论是否登录，都给浏览器设置user-key。
     */
    @Override
    public void postHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response,
        @NotNull Object handler, ModelAndView modelAndView) {

        UserInfoTO userInfoTO = UserHandler.get();
        // 若已经是临时用户，则不需要重复设置cookie。不是临时用户，则给浏览器设置cookie。
        if (!userInfoTO.getTempUser()) {
            Cookie cookie = new Cookie(TEMP_USER_COOKIE_NAME, userInfoTO.getUserKey());
            cookie.setDomain("wallsmall.com");
            cookie.setMaxAge(TEMP_USER_COOKIE_TIMEOUT);
            response.addCookie(cookie);
        }
    }

}
